package main

import (
	"context"
	"fmt"
	"time"
)

func main3() {
	// 创建取消上下文
	ctx, cancelFunc := context.WithCancel(context.Background())

	// 将取消上下文对象传入子协程
	go Speak(ctx)

	// 休眠3秒钟，保证子协程执行了一段时间，在控制台上可以观察到其输出
	time.Sleep(3 * time.Second)

	// 发送终止执行信号
	cancelFunc()

	// 休眠3秒钟，观察子协程是否结束
	time.Sleep(3 * time.Second)
}

func Speak(ctx context.Context) {
	for range time.Tick(time.Second) {
		select {
		case <-ctx.Done():
			fmt.Println("终止执行")
			return
		default:
			fmt.Println("Speak，执行中")
		}
	}
}